/*
@Time : 2019/8/26 0026 15:38
@Author : visons
*/
package main

import (
	"fmt"
	"github.com/go-redis/redis"
)

//Redis hash 是一个string类型的field和value的映射表，hash特别适合用于存储对象。
func HashTest(client *redis.Client) {
	//hset(key, field, value)：向名称为key的hash中添加元素field。
	ret, err := client.HSet("h1", "id1", 1).Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ret)

	//hget(key, field)：返回名称为key的hash中field对应的value。
	result, err := client.HGet("h1", "id1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

	//hmset(key, (fields))：向名称为key的hash中添加元素field 。
	items := map[string]interface{}{}
	items["id1"] = 1
	items["id2"] = 2
	items["id3"] = 3
	result, err = client.HMSet("h1", items).Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

	//hmget(key, (fields))：返回名称为key的hash中field i对应的value。
	results, err := client.HMGet("h1", "id1", "id2", "id3").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(results)

	//hexists(key, field)：名称为key的hash中是否存在键为field的域。
	ret, err = client.HExists("h1", "id9").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(ret)

	//hdel(key, field)：删除名称为key的hash中键为field的域。
	affect, err := client.HDel("h1", "id2").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(affect)

	//hkeys(key)：返回名称为key的hash中所有键。
	keys, err := client.HKeys("h1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(keys)

	//hvals(key)：返回名称为key的hash中所有键对应的value。
	values, err := client.HVals("h1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(values)

	//hgetall(key)：返回名称为key的hash中所有的键（field）及其对应的value。
	resMap, err := client.HGetAll("h1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(resMap)
}
